/*
 * ParseadorMensajes.cpp
 *
 *  Created on: 14/11/2013
 *      Author: juliansci
 */

#include "ParseadorMensajes.h"
#include <stdlib.h>
#include "../modelo/Soga.h"
#include "../modelo/Globo.h"
#include "../modelo/Huevo.h"
#include "../modelo/Flipper.h"
#include "../modelo/CintaTransportadora.h"
#include "../modelo/Motor.h"
#include "../modelo/Engranaje.h"
#include "../modelo/Tijera.h"
#include <iostream>
#include <sstream>

using namespace std;
ParseadorMensajes::ParseadorMensajes() {
	// TODO Auto-generated constructor stub

}

ParseadorMensajes::~ParseadorMensajes() {
	// TODO Auto-generated destructor stub
}

vector<string> ParseadorMensajes::parsearMensaje(char separador,
		string mensaje) {
	vector<string> vectorDatos;
	istringstream iss(mensaje);
	string msjActual = "";
	while (getline(iss, msjActual, separador) != NULL) {
		vectorDatos.push_back(msjActual);
	}
	return vectorDatos;
}

string ParseadorMensajes::parsearElemento(Elemento* elemento) {
	stringstream ss;
	string respuesta;
	if (elemento->getTipo() == "balancin") {
		Elemento* balancin = elemento;
		pair<Elemento*, Elemento*> extremos = balancin->obtenerExtremos();
		if (extremos.first != NULL && extremos.second != NULL) {
			//cout << "los dos diferente de null " << endl;
			ss << balancin->getIdElemento() << ";" << balancin->getTipo() << ";"
					<< balancin->getX() << ";" << balancin->getY() << ";"
					<< balancin->getAncho() << ";" << balancin->getAlto() << ";"
					<< balancin->getAnguloRotacion() << ";"
					<< extremos.first->getIdElemento() << ";"
					<< extremos.second->getIdElemento();

		} else if (extremos.first == NULL && extremos.first != NULL) {
			//	cout << "el priemro es null " << endl;
			ss << balancin->getIdElemento() << ";" << balancin->getTipo() << ";"
					<< balancin->getX() << ";" << balancin->getY() << ";"
					<< balancin->getAncho() << ";" << balancin->getAlto() << ";"
					<< balancin->getAnguloRotacion() << ";" << 0 << ";"
					<< extremos.second->getIdElemento();

		} else if (extremos.first != NULL && extremos.first == NULL) {
			ss << balancin->getIdElemento() << ";" << balancin->getTipo() << ";"
					<< balancin->getX() << ";" << balancin->getY() << ";"
					<< balancin->getAncho() << ";" << balancin->getAlto() << ";"
					<< balancin->getAnguloRotacion() << ";"
					<< extremos.first->getIdElemento() << ";" << 0;
		} else {
			ss << balancin->getIdElemento() << ";" << balancin->getTipo() << ";"
					<< balancin->getX() << ";" << balancin->getY() << ";"
					<< balancin->getAncho() << ";" << balancin->getAlto() << ";"
					<< balancin->getAnguloRotacion() << ";" << 0 << ";" << 0;
		}
	} else if (elemento->getTipo() == "soga") {
		Elemento* soga = elemento;
		pair<Elemento*, Elemento*> extremos = soga->obtenerExtremos();
		if (extremos.first != NULL && extremos.second != NULL) {
			//cout << "los dos diferente de null " << endl;
			ss << soga->getIdElemento() << ";" << soga->getTipo() << ";"
					<< soga->getX() << ";" << soga->getY() << ";"
					<< soga->getAncho() << ";" << soga->getAlto() << ";"
					<< soga->getAnguloRotacion() << ";"
					<< soga->getPosicionInicial().first << ";"
					<< soga->getPosicionInicial().second << ";"
					<< soga->getPosicionFinal().first << ";"
					<< soga->getPosicionFinal().second << ";"
					<< extremos.first->getIdElemento() << ";"
					<< extremos.second->getIdElemento();

		} else if (extremos.first == NULL && extremos.first != NULL) {
			//	cout << "el priemro es null " << endl;
			ss << soga->getIdElemento() << ";" << soga->getTipo() << ";"
					<< soga->getX() << ";" << soga->getY() << ";"
					<< soga->getAncho() << ";" << soga->getAlto() << ";"
					<< soga->getAnguloRotacion() << ";"
					<< soga->getPosicionInicial().first << ";"
					<< soga->getPosicionInicial().second << ";"
					<< soga->getPosicionFinal().first << ";"
					<< soga->getPosicionFinal().second << ";" << 0 << ";"
					<< extremos.second->getIdElemento();

		} else if (extremos.first != NULL && extremos.first == NULL) {
			ss << soga->getIdElemento() << ";" << soga->getTipo() << ";"
					<< soga->getX() << ";" << soga->getY() << ";"
					<< soga->getAncho() << ";" << soga->getAlto() << ";"
					<< soga->getAnguloRotacion() << ";"
					<< soga->getPosicionInicial().first << ";"
					<< soga->getPosicionInicial().second << ";"
					<< soga->getPosicionFinal().first << ";"
					<< soga->getPosicionFinal().second << ";"
					<< extremos.first->getIdElemento() << ";" << 0;
		} else {
			ss << soga->getIdElemento() << ";" << soga->getTipo() << ";"
					<< soga->getX() << ";" << soga->getY() << ";"
					<< soga->getAncho() << ";" << soga->getAlto() << ";"
					<< soga->getAnguloRotacion() << ";"
					<< soga->getPosicionInicial().first << ";"
					<< soga->getPosicionInicial().second << ";"
					<< soga->getPosicionFinal().first << ";"
					<< soga->getPosicionFinal().second << ";" << 0 << ";" << 0;
		}
	} else if (elemento->getTipo() == "correa") {
		Elemento* correa = elemento;
		pair<Elemento*, Elemento*> extremos = correa->obtenerExtremos();
		if (extremos.first != NULL && extremos.second != NULL) {
			ss << correa->getIdElemento() << ";" << correa->getTipo() << ";"
					<< correa->getX() << ";" << correa->getY() << ";"
					<< correa->getAncho() << ";" << correa->getAlto() << ";"
					<< correa->getAnguloRotacion() << ";"
					<< correa->getPosicionInicial().first << ";"
					<< correa->getPosicionInicial().second << ";"
					<< correa->getPosicionFinal().first << ";"
					<< correa->getPosicionFinal().second << ";"
					<< extremos.first->getIdElemento() << ";"
					<< extremos.second->getIdElemento();

		} else if (extremos.first == NULL && extremos.first != NULL) {
			ss << correa->getIdElemento() << ";" << correa->getTipo() << ";"
					<< correa->getX() << ";" << correa->getY() << ";"
					<< correa->getAncho() << ";" << correa->getAlto() << ";"
					<< correa->getAnguloRotacion() << ";"
					<< correa->getPosicionInicial().first << ";"
					<< correa->getPosicionInicial().second << ";"
					<< correa->getPosicionFinal().first << ";"
					<< correa->getPosicionFinal().second << ";" << 0 << ";"
					<< extremos.second->getIdElemento();

		} else if (extremos.first != NULL && extremos.first == NULL) {
			ss << correa->getIdElemento() << ";" << correa->getTipo() << ";"
					<< correa->getX() << ";" << correa->getY() << ";"
					<< correa->getAncho() << ";" << correa->getAlto() << ";"
					<< correa->getAnguloRotacion() << ";"
					<< correa->getPosicionInicial().first << ";"
					<< correa->getPosicionInicial().second << ";"
					<< correa->getPosicionFinal().first << ";"
					<< correa->getPosicionFinal().second << ";"
					<< extremos.first->getIdElemento() << ";" << 0;
		} else {
			ss << correa->getIdElemento() << ";" << correa->getTipo() << ";"
					<< correa->getX() << ";" << correa->getY() << ";"
					<< elemento->getAncho() << ";" << elemento->getAlto() << ";"
					<< correa->getAnguloRotacion() << ";"
					<< correa->getPosicionInicial().first << ";"
					<< correa->getPosicionInicial().second << ";"
					<< correa->getPosicionFinal().first << ";"
					<< correa->getPosicionFinal().second << ";" << 0 << ";"
					<< 0;
		}
	} else if (elemento->getTipo() == "globo") {
		Globo* globo = (Globo*) elemento;
		ss << globo->getIdElemento() << ";" << globo->getTipo() << ";"
				<< globo->getX() << ";" << globo->getY() << ";"
				<< globo->getAncho() << ";" << globo->getAlto() << ";"
				<< elemento->getAnguloRotacion() << ";"
				<< globo->estaPinchado();
	} else if (elemento->getTipo() == "huevo") {
		Huevo* huevo = (Huevo*) elemento;
		ss << huevo->getIdElemento() << ";" << huevo->getTipo() << ";"
				<< huevo->getX() << ";" << huevo->getY() << ";"
				<< huevo->getAncho() << ";" << huevo->getAlto() << ";"
				<< elemento->getAnguloRotacion() << ";" << huevo->estaRoto();
	} else if (elemento->getTipo() == "atijera") {
		Tijera* tijera = (Tijera*) elemento;
		ss << tijera->getIdElemento() << ";" << tijera->getTipo() << ";"
				<< tijera->getX() << ";" << tijera->getY() << ";"
				<< tijera->getAncho() << ";" << tijera->getAlto() << ";"
				<< elemento->getAnguloRotacion() << ";"
				<< tijera->estaCerrada();
	} else if (elemento->getTipo() == "engranaje") {
		Engranaje* engranaje = (Engranaje*) elemento;
		if (engranaje->obtenerCorrea() != NULL) {
			ss << engranaje->getIdElemento() << ";" << engranaje->getTipo()
					<< ";" << engranaje->getX() << ";" << engranaje->getY()
					<< ";" << engranaje->getAncho() << ";"
					<< engranaje->getAlto() << ";"
					<< engranaje->getAnguloRotacion() << ";"
					<< engranaje->obtenerCorrea()->getIdElemento() << ";"
					<< engranaje->estaAndando << endl;
		} else {
			ss << engranaje->getIdElemento() << ";" << engranaje->getTipo()
					<< ";" << engranaje->getX() << ";" << engranaje->getY()
					<< ";" << engranaje->getAncho() << ";"
					<< engranaje->getAlto() << ";"
					<< engranaje->getAnguloRotacion() << ";" << 0 << ";"
					<< engranaje->estaAndando << endl;
		}
	} else if (elemento->getTipo() == "motor") {
		Motor* motor = (Motor*) elemento;
		string sentidoRotacion;
		if (motor->isRotaADerecha() == true) {
			sentidoRotacion = "true";
		} else {
			sentidoRotacion = "false";
		}
		if (motor->obtenerEngranaje() != NULL) {
			ss << motor->getIdElemento() << ";" << motor->getTipo() << ";"
					<< motor->getX() << ";" << motor->getY() << ";"
					<< motor->getAncho() << ";" << motor->getAlto() << ";"
					<< elemento->getAnguloRotacion() << ";" << sentidoRotacion
					<< ";" << motor->obtenerEngranaje()->getIdElemento();
		} else {
			ss << motor->getIdElemento() << ";" << motor->getTipo() << ";"
					<< motor->getX() << ";" << motor->getY() << ";"
					<< motor->getAncho() << ";" << motor->getAlto() << ";"
					<< elemento->getAnguloRotacion() << ";" << sentidoRotacion
					<< ";" << 0;
		}
	} else if (elemento->getTipo() == "cinta") {
		CintaTransportadora* cinta = (CintaTransportadora*) elemento;
		if (cinta->obtenerEngranaje() != NULL) {
			ss << cinta->getIdElemento() << ";" << cinta->getTipo() << ";"
					<< cinta->getX() << ";" << cinta->getY() << ";"
					<< cinta->getAncho() << ";" << cinta->getAlto() << ";"
					<< cinta->getAnguloRotacion() << ";" <<cinta->obtenerEngranaje()->getIdElemento();
		} else {
			ss << cinta->getIdElemento() << ";" << cinta->getTipo() << ";"
					<< cinta->getX() << ";" << cinta->getY() << ";"
					<< cinta->getAncho() << ";" << cinta->getAlto() << ";"
					<< cinta->getAnguloRotacion() << ";" << 0;
		}
	} else if (elemento->getTipo() == "flipper") {
		Flipper* flipper = (Flipper*) elemento;
		string sentidoRotacion;
		if (flipper->isRotaADerecha() == true) {
			sentidoRotacion = "true";
		} else {
			sentidoRotacion = "false";
		}

		ss << flipper->getIdElemento() << ";" << flipper->getTipo() << ";"
				<< flipper->getX() << ";" << flipper->getY() << ";"
				<< flipper->getAncho() << ";" << flipper->getAlto() << ";"
				<< elemento->getAnguloRotacion() << ";" << sentidoRotacion;
// FIN FLIPPER Y MOTOR
	} else {
		ss << elemento->getIdElemento() << ";" << elemento->getTipo() << ";"
				<< elemento->getX() << ";" << elemento->getY() << ";"
				<< elemento->getAncho() << ";" << elemento->getAlto() << ";"
				<< elemento->getAnguloRotacion();
	}
	return ss.str();

}

string ParseadorMensajes::parsearListaElementos(
		list<Elemento*>* listaElementos) {
	list<Elemento*>::iterator itListaElementos = listaElementos->begin();
	Elemento* elementoActual;
	stringstream ss;
	for (; itListaElementos != listaElementos->end(); ++itListaElementos) {
		elementoActual = *itListaElementos;
		ss << this->parsearElemento(elementoActual) << "|";
	}
	return ss.str();
}

